#pragma once

#include "iostream"
#include "vector"
#include "algorithm"

using namespace std;

/*HJJ QQ479287006
 *给你一个 32 位的有符号整数 x ，返回将 x 中的数字部分反转后的结果。

如果反转后整数超过 32 位的有符号整数的范围 [−231,  231 − 1] ，就返回 0。

假设环境不允许存储 64 位整数（有符号或无符号）。
 

示例 1：

输入：x = 123
输出：321
示例 2：

输入：x = -123
输出：-321
示例 3：

输入：x = 120
输出：21
示例 4：

输入：x = 0
输出：0
 

来源：力扣（LeetCode）
链接：https://leetcode.cn/problems/reverse-integer
著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 * */


static int reverse2(int x) {


    string s = to_string(x);
    int low = 0;
    //如果包含负号
    if (s.find("-") != s.npos) {
        low = 1;
    }
    int high = s.size() - 1;
    while (low <= high) {
        char temp = s[low];
        s[low] = s[high];
        s[high] = temp;
        low++;
        high--;
    }
//    if (s.compare(to_string(INT_MAX))>0 && s.size()>)
//    {
//        return 0;
//    }

    if (atol(s.c_str()) > INT_MAX || atol(s.c_str()) < INT_MIN)
        return 0;

    return atol(s.c_str());

}

static int reverse1(int x) {
    //1234
    int sum = 0;
    while (x != 0) {
        int temp = x % 10;
        x = x / 10;
        sum = sum * 10 + temp;
    }


    return sum;
}

///这个题用这个方法 前面的好像自己写的比较low
int reverse(int x) noexcept(false) {

    int result = 0;
    while (x != 0) {
        //正数最大值+1变成负数最大值了 负数最大值减去1 变成正数最大值了 所以这个非常巧妙
        // 正数和负数不用区分


        //如果是正数 则她肯定大于INTMIN  肯定走result>INIT_MAX/10
        //如果是负数 肯定走第一个INI_MIN 怎么说 肯定是小于
        if (result < INT_MIN / 10 || result > INT_MAX / 10) {
            return 0;
        }

        result = (result * 10 + (x % 10));
        x = x / 10;

    }


    return result;

}